p2m_entry_retry(&entry)) {
/* dtlb has been purged in-between. This dtlb was
matching. Undo the work. */
- vcpu_flush_tlb_vhpt_range(address & ((1 << logps) - 1),
- logps);
+ vcpu_flush_tlb_vhpt_range(address, logps);
// the stale entry which we inserted above
// may remains in tlb cache.
TR_ENTRY *trp;
if (slot >= NDTRS) return IA64_RSVDREG_FAULT;
+
+ vcpu_purge_tr_entry(&PSCBX(vcpu, dtlb));
+
trp = &PSCBX(vcpu,dtrs[slot]);
//printf("***** itr.d: setting slot %d: ifa=%p\n",slot,ifa);
vcpu_set_tr_entry(trp,pte,itir,ifa);
vcpu_quick_region_set(PSCBX(vcpu,dtr_regions),ifa);
+
+ vcpu_flush_tlb_vhpt_range(ifa & itir_mask(itir), itir_ps(itir));
+
return IA64_NO_FAULT;
}
TR_ENTRY *trp;
if (slot >= NITRS) return IA64_RSVDREG_FAULT;
+
+ vcpu_purge_tr_entry(&PSCBX(vcpu, itlb));
+
trp = &PSCBX(vcpu,itrs[slot]);
//printf("***** itr.i: setting slot %d: ifa=%p\n",slot,ifa);
vcpu_set_tr_entry(trp,pte,itir,ifa);
vcpu_quick_region_set(PSCBX(vcpu,itr_regions),ifa);
+
+ vcpu_flush_tlb_vhpt_range(ifa & itir_mask(itir), itir_ps(itir));
+
return IA64_NO_FAULT;
}
vcpu_itc_no_srlz(vcpu,2,ifa,pteval,pte,logps);
if (swap_rr0) set_metaphysical_rr0();
if (p2m_entry_retry(&entry)) {
- vcpu_flush_tlb_vhpt_range(ifa & ((1 << logps) - 1), logps);
+ vcpu_flush_tlb_vhpt_range(ifa, logps);
goto again;
}
return IA64_NO_FAULT;
vcpu_itc_no_srlz(vcpu, 1,ifa,pteval,pte,logps);
if (swap_rr0) set_metaphysical_rr0();
if (p2m_entry_retry(&entry)) {
- vcpu_flush_tlb_vhpt_range(ifa & ((1 << logps) - 1), logps);
+ vcpu_flush_tlb_vhpt_range(ifa, logps);
goto again;
}
return IA64_NO_FAULT;